package lq1451;

import java.util.ArrayList;
import java.util.Scanner;
/*
lq1451,AC
输入数据：
5
1
1
1
2

输出：
4
*/
public class Main {
	//顺序表数组表示tree
	//数组下标是节点编号，数组元素是节点的子节点顺序表
	static ArrayList<Integer>[] tree;
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		//节点数量
		int n = sc.nextInt();
		//节点（下标）从1开始计数
		tree = new ArrayList[n + 1];
        for (int i = 2; i <= n; i++) {
        	//i表示当前节点编号
        	//v表示当前节点的父节点编号
            int v = sc.nextInt();
            if (tree[v] == null)
                tree[v] = new ArrayList<Integer>();
            tree[v].add(i);
        }
        
        System.out.print(dp(1));

	}
	
	//动态规划，返回输入节点转换后的最大高度
	static int dp(int v) {
		//按题意，没子节点，高度为0
		if (tree[v] == null) 
			return 0;
		//转换后最大高度
        int max = 0;
        //遍历当前节点的每个子节点
        for (int w : tree[v])
            max = Math.max(max, dp(w));
        //最大高度加子节点数量
        return tree[v].size() +  max;
	}

}
